// 应用入口文件
App({
  /**
   * 当小程序初始化完成时，会触发 onLaunch（全局只触发一次）
   */
  onLaunch() {
    // 展示本地存储能力（添加错误处理）
    try {
      const logs = wx.getStorageSync('logs') || []
      logs.unshift(Date.now())
      wx.setStorageSync('logs', logs)
    } catch (error) {
      console.warn('日志存储失败:', error)
    }

    // 检查更新
    this.checkForUpdate();

    // 获取系统信息
    this.getSystemInfo();

    // 检查网络连接并选择最佳API地址
    this.checkNetworkConnection();

    // 初始化云开发
    this.initCloud();
    
    // 检查登录状态
    this.checkLoginStatus();

    // 启动后统一鉴权闸门：未登录则跳转登录页
    try { setTimeout(() => this.ensureAuthGate(), 0); } catch (e) {}

    console.log('小程序启动成功');
  },

  /**
   * 当小程序启动，或从后台进入前台显示，会触发 onShow
   */
  onShow(options) {
    console.log('小程序显示', options);
    
    // 处理场景值
    this.handleScene(options);

    // 前台显示时再次触发鉴权
    try { this.ensureAuthGate(); } catch (e) {}
  },

  /**
   * 当小程序从前台进入后台，会触发 onHide
   */
  onHide() {
    console.log('小程序隐藏');
  },

  /**
   * 当小程序发生脚本错误，或者 api 调用失败时，会触发 onError 并带上错误信息
   */
  onError(msg) {
    console.error('小程序错误', msg);
    
    // 过滤掉已知的无害错误
    if (msg && typeof msg === 'string') {
      if (msg.includes('wxfile://usr/miniprogramLog') || 
          msg.includes('backgroundfetch privacy fail') ||
          msg.includes('jsapi invalid request data')) {
        // 这些是系统级错误，不影响功能，忽略处理
        return;
      }
    }
    
    // 错误上报（后续需要时启用）
    // this.reportError(msg);
  },

  /**
   * 检查小程序更新
   */
  checkForUpdate() {
    if (wx.canIUse('getUpdateManager')) {
      const updateManager = wx.getUpdateManager();
      
      updateManager.onCheckForUpdate((res) => {
        if (res.hasUpdate) {
          console.log('发现新版本');
        }
      });

      updateManager.onUpdateReady(() => {
        wx.showModal({
          title: '更新提示',
          content: '新版本已经准备好，是否重启应用？',
          success: (res) => {
            if (res.confirm) {
              updateManager.applyUpdate();
            }
          }
        });
      });

      updateManager.onUpdateFailed(() => {
        wx.showModal({
          title: '更新提示',
          content: '新版本下载失败，请删除小程序重新打开',
          showCancel: false
        });
      });
    }
  },

  /**
   * 获取系统信息
   */
  getSystemInfo() {
    // 使用新的API替代废弃的wx.getSystemInfo
    const deviceInfo = wx.getDeviceInfo();
    const windowInfo = wx.getWindowInfo();
    const appBaseInfo = wx.getAppBaseInfo();
    
    // 合并信息以保持兼容性
    const systemInfo = {
      ...deviceInfo,
      ...windowInfo,
      ...appBaseInfo
    };
    
    this.globalData.systemInfo = systemInfo;
    this.globalData.isIphoneX = deviceInfo.model && deviceInfo.model.indexOf('iPhone X') > -1;
    this.globalData.statusBarHeight = windowInfo.statusBarHeight;
    this.globalData.screenWidth = windowInfo.screenWidth;
    this.globalData.screenHeight = windowInfo.screenHeight;
    
    console.log('系统信息:', systemInfo);
  },

  /**
   * 处理场景值
   */
  handleScene(options) {
    const scene = options.scene;
    this.globalData.scene = scene;
    
    // 根据不同场景处理
    switch (scene) {
      case 1001: // 发现栏小程序主入口
        console.log('来自发现栏小程序主入口');
        break;
      case 1047: // 扫描小程序码
        console.log('来自小程序码');
        break;
      case 1007: // 单人聊天会话中的小程序消息卡片
        console.log('来自聊天会话');
        break;
      default:
        console.log('来自其他场景:', scene);
    }
  },

  /**
   * 检查网络连接并选择最佳API地址
   */
  async checkNetworkConnection() {
    try {
      const { networkUtil } = require('./utils/network.js');
      
      // 显示网络检测提示
      wx.showLoading({
        title: '检测网络连接...',
        mask: true
      });
      
      // 查找最佳API地址
      const bestApiUrl = await networkUtil.findBestApi();
      
      // 更新全局配置
      this.globalData.config.apiBase = bestApiUrl;
      
      wx.hideLoading();
      console.log('网络连接正常，使用API地址:', bestApiUrl);
      
    } catch (error) {
      wx.hideLoading();
      console.error('网络连接检测失败:', error);
      
      // 显示网络连接失败提示
      wx.showModal({
        title: '网络连接异常',
        content: '无法连接到服务器，请检查网络设置后重启小程序',
        showCancel: false,
        confirmText: '确定'
      });
    }
  },

  /**
   * 检查登录状态
   */
  checkLoginStatus() {
    const token = wx.getStorageSync('local_token');
    let userInfo = wx.getStorageSync('userInfo');

    // 兼容历史缓存中的本地绝对路径，统一替换为主包可用的图标路径
    try {
      if (userInfo && typeof userInfo === 'object') {
        const url = userInfo.avatarUrl || userInfo.avatar_url;
        if (typeof url === 'string' && url.indexOf('/assets/icons/') === 0) {
          userInfo.avatarUrl = '/static/icons/avatar-placeholder.png';
          // 回写缓存，避免后续页面再次读到错误路径
          wx.setStorageSync('userInfo', userInfo);
        }
      }
    } catch (e) {
      // 忽略清洗异常，保证后续逻辑继续
    }
    
    if (userInfo && !token) {
      // 兜底：存在用户信息但缺少本地token，自动生成占位token
      const newToken = 'local_' + Date.now();
      wx.setStorageSync('local_token', newToken);
      this.globalData.local_token = newToken;
      this.globalData.userInfo = userInfo;
      console.log('检测到无token但存在用户信息，已生成本地token');
    } else if (token && userInfo) {
      // 已登录，保存到全局数据
      this.globalData.local_token = token;
      this.globalData.userInfo = userInfo;
      console.log('用户已登录:', userInfo.nickname || userInfo.nickName);
    } else {
      // 未登录，清除可能存在的无效数据
      wx.removeStorageSync('local_token');
      wx.removeStorageSync('refresh_token');
      wx.removeStorageSync('userInfo');
      this.globalData.local_token = null;
      this.globalData.userInfo = null;
      console.log('用户未登录');
    }
  },

  /**
   * 统一登录鉴权闸门：未登录则跳转登录页
   */
  ensureAuthGate() {
    try {
      const userInfo = wx.getStorageSync('userInfo');
      const pages = getCurrentPages();
      const currentRoute = pages && pages.length ? '/' + pages[pages.length - 1].route : '';
      const isLoginPage = currentRoute.indexOf('/subpkg/pages/login/login') > -1 || currentRoute.indexOf('/pages/login/login') > -1;
      if (!userInfo && !isLoginPage) {
        wx.reLaunch({ url: '/subpkg/pages/login/login' });
      }
    } catch (e) {
      // 忽略
    }
  },

  /**
   * 初始化云开发
   */
  initCloud() {
    if (!wx.cloud) {
      console.error('请使用 2.2.3 或以上的基础库以使用云能力');
      this.globalData.cloudInitialized = false;
      this.globalData.cloudError = '基础库版本过低，请升级微信版本';
      return;
    }
    
    try {
      // 配置你的云环境ID
      const cloudEnvId = 'cloud1-4gh6zxife515a522'; // 实际的云环境ID
      
      wx.cloud.init({
        env: cloudEnvId, // 指定云环境ID
        traceUser: true,
      });
      
      console.log('云开发初始化成功，环境ID:', cloudEnvId);
      this.globalData.cloudInitialized = true;
      this.globalData.cloudEnvId = cloudEnvId;
    } catch (error) {
      console.error('云开发初始化失败:', error);
      this.globalData.cloudInitialized = false;
      this.globalData.cloudError = error.message || '云开发初始化失败';
    }
  },

  /**
   * 全局数据
   */
  globalData: {
    userInfo: null,
    local_token: null,
    systemInfo: null,
    isIphoneX: false,
    statusBarHeight: 0,
    screenWidth: 0,
    screenHeight: 0,
    scene: 0,
    
    // 应用配置
    config: {
      apiBase: 'http://localhost:8000',
      version: '1.0.0',
      build: '100'
    },
    
    // 云开发状态
    cloudInitialized: false,
    cloudEnvId: null,
    cloudError: null
  },

  /**
   * 工具方法：显示加载中
   */
  showLoading(title = '加载中...') {
    wx.showLoading({
      title,
      mask: true
    });
  },

  /**
   * 工具方法：隐藏加载中
   */
  hideLoading() {
    wx.hideLoading();
  },

  /**
   * 工具方法：显示提示
   */
  showToast(title, icon = 'none', duration = 2000) {
    wx.showToast({
      title,
      icon,
      duration
    });
  },

  /**
   * 工具方法：显示模态框
   */
  showModal(title, content, showCancel = true) {
    return new Promise((resolve, reject) => {
      wx.showModal({
        title,
        content,
        showCancel,
        success: (res) => {
          resolve(res);
        },
        fail: reject
      });
    });
  }
});